package com.share.device.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.share.device.domain.Region;
import com.share.device.mapper.RegionMapper;
import com.share.device.service.IRegionService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import java.util.List;

@Service
public class RegionServiceImpl extends ServiceImpl<RegionMapper, Region> implements IRegionService {
    @Autowired
    private RegionMapper regionMapper;

    /**
     * 根据父区域代码选择区域树
     *
     * @param parentCode 父区域代码，用于筛选区域
     * @return 返回一个区域列表，每个区域包含其是否有子区域的信息
     */
    @Override
    public List<Region> treeSelect(String parentCode) {
        // 查询指定父区域代码的所有区域
        List<Region> regionList = regionMapper.selectList(new LambdaQueryWrapper<Region>().eq(Region::getParentCode, parentCode));
        // 如果查询到的区域列表不为空，则进一步处理每个区域
        if (!CollectionUtils.isEmpty(regionList)) {
            regionList.forEach(item -> {
                // 计算当前区域的子区域数量
                long count = regionMapper.selectCount(new LambdaQueryWrapper<Region>().eq(Region::getParentCode, item.getCode()));
                // 根据子区域数量设置当前区域的hasChildren属性
                if (count > 0) {
                    item.setHasChildren(true);
                } else {
                    item.setHasChildren(false);
                }
            });
        }
        // 返回处理后的区域列表
        return regionList;
    }

    /**
     * 根据区域代码获取区域名称
     * <p>
     * 此方法用于通过区域代码查询对应的区域名称如果代码为空或在数据库中找不到对应的区域，
     * 则返回空字符串这样可以确保调用此方法时总能获得一个字符串值，避免了可能的NullPointerException
     *
     * @param code 区域代码，用于查询区域名称如果为空，将返回空字符串
     * @return 区域名称如果找不到对应区域或代码为空，则返回空字符串
     */
    @Override
    public String getNameByCode(String code) {
        // 检查输入的代码是否为空，如果为空则直接返回空字符串
        if (StringUtils.isEmpty(code)) {
            return "";
        }
        // 通过代码查询数据库中的区域信息，只选择名称字段
        Region region = regionMapper.selectOne(new LambdaQueryWrapper<Region>().eq(Region::getCode, code).select(Region::getName));
        // 检查查询结果是否为空，如果不为空则返回区域名称
        if (null != region) {
            return region.getName();
        }
        // 如果查询结果为空，返回空字符串
        return "";
    }


}